2019/10/13
設計資料模型的時候,有一些注意事項或是小技巧,小提醒,想要告訴大家的,所以多寫了這一篇「設計資料模型的兩三事」。
這一篇最主要是希望告訴大家一些設計或規劃資料模型的時候,需要特別注意的地方,也把自己的一些小經驗寫在這邊提供大家參考。
這個我們講過很多次了,在設計資料模型之前,當然就一定要先選擇好你的資料模型架構,才能順利地往下開發設計你的資料模型,我們在選擇資料模型型態的時候,當然先從兩者差異的比較點選擇起,所以這裡列了主要的差異比較點讓大家比較容易記得比較的方法:
屬性的關係 (Attribute Relationship) 是設計 Cube 最重要的事情,因為資料的關係會影響到 Cube 的資料處理和資料查詢作業,最佳化 Dimension 就是最佳化屬性的關係,首先,會大大的降低 Cube 儲存空間,Dimension 處理的速度會更快,Cube 查詢的執行效率將會有所改進,所以最重要的事情就是要設計最佳化的屬性關係。
一般來說,我們在設計資料模型的維度時,第一個想到的維度一定是時間,很多資料都會需要從時間的視角來切割,過濾或查詢資料,所以,我們會建立一個通用的日期表格 (Date Table),他也會有 Master Data(主檔)的概念,使用這個通用的日期表格來關聯其他的資料表格,當作一個日期查詢主要切入的維度視角。我們也可以用多個 Date Tables 來對應到多個模型表格資料,Date Table 設計的時候需要注意一些事項:
資料庫的查詢比對作業,如果是文字欄位,資料庫的資料抓取行為就需要多一個動作,比較慢,所以我們設計表格關聯的時候,使用的鍵值會盡量使用數字。
數字欄位的精細程度,視商業邏輯需求而定,但是我們不要把精細度設得太精密,只需要剛剛好符合商業需求即可,因為太高的精細度會影響資料庫計算的速度。
表格的設計不要太寬(欄位數過多),長(資料筆數多)沒有關係,大量資料的儲存盡量採用 Table Partition 的儲存設計方式,另外,也需要設計良好的 Cache 或 In-Memory 處理,常用的資料勁量放到記憶體中來處理及查詢,這樣會加快很多速度。
另外,還有一些資料模型最佳化的設計要點,列舉如下提供大家參考:
盡可能刪除沒有用到的 tables or columns
盡量避免欄位中的高基數 distinct counts(如:百萬個 distinct 值)
盡可能使用整數 Integer 來代替字串 String
小心使用 DAX functions 有一些 Function 會 Scan 所有的資料筆數,這樣會變慢很多
Index 的設計影響很大,可以考慮 indexing columns(經常用來 filter or slice 的欄位)
PS : 其實,設計資料模型沒有一定的規則,也沒有誰對誰錯的問題,只要能正確處理資料,查詢資料,都是可用的資料模型,但是,好的資料模型和不好的資料模型之間,差異可是非常大的,執行速度,方便好用的分析,快速好用,甚至可能影響到資料查詢或分析上的複雜度,所以,設計一個良好的資料模型是非常重要的。